†IPFSを実行しながら学んでいく3 のおまけ~DNSLink~ †
††学んだ内容をメモメモ††
IPFSはコンテンツベースのアドレス指定を使用し、 ファイルに含まれるデータに基づいてファイルのアドレスを作成する(immutability) と学びました。
コンテンツに更新があると、アドレスが変更になるので、 Webサイトなどの更新が必要なものだと毎回ユーザーに新しいアドレスを伝えなくてはいけないのは不便なので、 IPNS(InterPlantery Naming Service)という更新可能なアドレスを作成し、コンテンツのCIDが変わってもアクセスするアドレスは同じにできるという仕組みがあることも知れました。
†IPFSをコマンドラインで実行しながら学んでいく3 ~不変性~ †
今回はIPNS以外にDNSLinkというものも使用できる とあったので、これについて試していきたいと思います。
これは、現在IPNSよりもはるかに高速で、人間が読める名前=可読性に優れている も使用できるので結構使われているとのこと
試してみる
IPFS上のコンテンツのアドレスの変更によりアクセスが難しくなる問題に対して、DNSレコードを介して解決するのがDNSLinkです、。
DNSLinkは、DNSのTXTレコードを使用して、ipfs.ioのようなDNS名をIPFSアドレスにマッピングしています。
- DNSLinkアドレス例
/ipns/blog.classmethod.jp
IPNSでは /ipns/k51qzi5uqu5dic7r0ly7l3d65nsfp7gbbmwv6cj0216kx9fgsfykzdnsdmrdn6
のようにハッシュ化された公開鍵が使われていましたが、DNSLinkでは代わりにDNS名を使用します。
/ipns/blog.classmethod.jp/assets/ /ipns/blog.classmethod.jp/images/aaaaaaaa.png
といった他のファイルへのリンク、またはディレクトリやシンボリックリンクなど、IPFSがサポートする他の種類のリソースへのリンクを含めることができます
ユースケース
手持ちのドメインを使用し、IPFSにアップロードしたWebページにアクセスするケースを考えてみます。
アクセスは公開ゲートウェイを使います。
サンプルWebページの用意
blogというフォルダにindexと画像フォルダを用意しました。
blog images index.html
index.html
<html> <meta charset="UTF-8"> <body> <p>こんにちは、世界</p> <img src="images/pic_01_l.jpg"> </body> </html>
このフォルダごとIPFSにアップロードします。
必要であればPINも行います
$ ipfs add -r blog added QmZSHMbE41iWmn3hBbTw9fs38Yto69DBMz7Xob3vDzY4nm blog/images/pic_01_l.jpg added QmYvEDxciU7r6mPn9ehh9tq5Ru1Nx9ZzrVnzoB9CPKhPmz blog/index.html added QmRmAGVYEJW5XZn3eBdNjsLStHgS8NR1VGMzvpCRZbfnJK blog/images added QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh blog ## 必要なら $ ipfs pin add -r QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh pinned QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh recursively
ipfs daemon
を実行していると、ローカルホストでのアクセスが可能です。
- https://localhost:8080/ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh
blogフォルダにあったindex.html
DNS設定
所有しているドメインに_dnslinkを付けて、DNS TXTレコードとしてマッピングを公開します。
ドメイン blog.auth.classmethod.net
であれば、
_dnslink.blog.auth.classmethod.net
をDNSに登録します。
TXTレコードの値は、
dnslink=/ipfs/<<CID>>
または
dnslink=/ipns/<<IPNSの公開鍵>>
の形式でコンテンツの場所を設定します。
今回は更新を伴うコンテンツを扱うためIPNSを使います
$ ipfs name publish /ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh Published to k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv: /ipfs/QmZH9d4oeMhzE8sjJQbxTAXxQHV93Nv1NQ3cdTYDVsJkQh
TXTレコードには、以下のようにIPNSを設定します
※ IPNSキーがk51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv
の場合
dnslink=/ipns/k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv
digで名前解決した時の例)
$ dig +noall +answer TXT _dnslink.<<あなたの所有ドメイン>> _dnslink.<<あなたの所有ドメイン>>. 300 IN TXT "dnslink=/ipns/k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv"
IPFSクライアントやノードがアドレス解決を試みるとき、dnslink=を先頭に持つTXTレコードを探します.
アクセスしてみる
DNSを登録すると 公開ゲートウェイを通じて
https://ipfs.io/ipns/<<あなたの所有ドメイン>>
でアクセスできるようになります。
もし公開ゲートウェイ側からアクセスできない場合は、ローカルホストからアクセスしてみましょう。
https://localhost:8080/ipns/<<あなたの所有ドメイン>>
となります。
できてるー!
コンテンツの更新
次はblogフォルダにあったindex.htmlを更新してみます。
<html> <meta charset="UTF-8"> <body> <p>こんにちは、世界!</p> <p>外には美しい景色が広がっていますね</p> <img src="images/pic_01_l.jpg"> </body> </html>
これを更新すると、CIDが変更されます
$ ipfs add -r blog added QmZSHMbE41iWmn3hBbTw9fs38Yto69DBMz7Xob3vDzY4nm blog/images/pic_01_l.jpg added QmfYfFQCaRtJPs28vULTwNCJVkphEpCEafvN2EvbRWB6vS blog/index.html added QmRmAGVYEJW5XZn3eBdNjsLStHgS8NR1VGMzvpCRZbfnJK blog/images added QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz blog
更新されたCIDをIPNSにパブリッシュします。
$ ipfs name publish /ipfs/QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz Published to k51qzi5uqu5di9kl58x19u26pvm1gbhou4a7fhn8d4gr827rqx6221dq5ntcfv: /ipfs/QmPMYeLBc3wX4LnJ2ZpMBL7izoqhZq9MbXhpU164Wg1gwz
パブリッシュ後、https://<<ゲートウェイのドメイン>>/ipns/blog.auth.classmethod.net
にアクセスすると
追加した文章が表示されております。
更新時のフローまとめ
dnslinkとのマッピングにIPNSの値を設定していると、
何か更新のたびに
ipfs add
でのコンテンツ追加ipfs name publish
でのIPNSに公開
を行うことになります。
dnslinkとのマッピングにIPFSの値を設定している場合だと、
コンテンツに更新があった場合は
ipfs add
でのコンテンツ追加- DNSレコードの設定を新しいCIDに変更
といった手順となりそうですね。
ユーザーからのアクセスは、https://<<ゲートウェイのドメイン>>/ipns/<<アクセスさせたいドメイン>>
となります。